package com.dmp.storm.bolt.redis;

import com.dmp.common.redis.JedisUtils;
import com.dmp.storm.bolt.BaseMapBolt;

import java.util.Map;

/**
 * @ClassName BaseRedisBolt
 * @Description
 *
 * @author sunzy
 * @date 2016年2月25日 下午2:21:55
 * @version 1.0
 *
 */
public abstract class BaseRedisBolt extends BaseMapBolt {
	private String propPath = null;
	protected Map<String, Map> redisMap = null;
	protected Map<String, String> redisString = null;
	protected Map<String, Object> boltMap = null;


	/**
	 * @author sunzy
	 * @date 2016年2月25日 下午6:17:06
	 * @Description 获取redis参数，连接redis
	 *
	 * 
	 * @see BaseMapBolt#prepare()
	 */
	@Override
	public void prepare() {
		JedisUtils.setJedisPool(this.propPath);
	}
	
	public void init(){
		this.boltMap = null;
		this.initRedisParam();
	}
	
	public void initRedisParam(){
		this.redisMap = null;
		this.redisString = null;
	}
	
	/**
	 * @author sunzy
	 * @date 2016年2月25日 下午6:17:03
	 * @Description
	 *
	 * @param map
	 * @return
	 * 
	 * @see BaseMapBolt#process(Map)
	 */
	@Override
	public Map<String, Object> process(Map<String, Object> map) {
		// 初始化内部数据
		this.init();
		
		// 数据流map处理
		this.deal(map);
		
		// 设置redis入库数据
		this.setRedisData();

		// 入库到redis
		this.insertRedis();

		// 处理完后清空数据
		this.initRedisParam();
		
		// 设置下节点的数据流map
		this.setNextBoltMap();
		
		return this.boltMap;
	}

	/** 
	  * @author  sunzy
	  * @date 2016年2月26日 下午4:29:48 
	  * @Description 将成员redis所有param数据录入到redis
	  *
	  * @return  void
	  */
	private void insertRedis() {
		// 将map数据集入库
		if (this.redisMap != null) {
			JedisUtils.setAllMap(this.redisMap);
		}

		// 将string数据集入库
		if (this.redisString != null) {
			JedisUtils.setAllString(this.redisString);
		}
		
	}

	/**
	 * @author sunzy
	 * @date 2016年2月25日 下午6:19:25
	 * @Description
	 *
	 * @param map
	 *            数据流
	 * @return
	 * @return Map<String,Object>
	 */
	public abstract void deal(Map<String, Object> map);

	/**
	 * @author sunzy
	 * @date 2016年2月26日 下午3:44:28
	 * @Description 设置redis入库数据
	 *
	 */
	public abstract void setRedisData();

	/**
	 * @author sunzy
	 * @date 2016年2月26日 下午3:44:31
	 * @Description 设置下节点的数据流map
	 *
	 */
	public abstract void setNextBoltMap();

	/**
	 * @author sunzy
	 * @date 2016年2月25日 下午6:19:31
	 * @Description 设置redis配置文件
	 *
	 * @param propPath
	 *            redis配置文件
	 * @return void
	 */
	public void setPropPath(String propPath) {
		this.propPath = propPath;
	}

	public Map<String, Map> getRedisMap() {
		return this.redisMap;
	}

	public void setRedisMap(Map<String, Map> redisMap) {
		this.redisMap = redisMap;
	}

	public Map<String, String> getRedisString() {
		return this.redisString;
	}

	public void setRedisString(Map<String, String> redisString) {
		this.redisString = redisString;
	}

	public Map<String, Object> getBoltMap() {
		return this.boltMap;
	}

	public void setBoltMap(Map<String, Object> boltMap) {
		this.boltMap = boltMap;
	}
}
